package mythread;

/**
 * @Auther: cty
 * @Date: 2020/1/12 19:30
 * @Description:
 * @version: 1.0
 */

/**
 * 可重入锁: 锁可以延续使用 + 计数器
 *
 * @author 裴新 QQ:3401997271
 *
 */
public class Ji_Other_Lock03 {
    ReLock lock = new ReLock();
    public void a() throws InterruptedException {
        lock.lock();
        System.out.println(lock.getHoldCount());
        doSomething();
        lock.unlock();
        System.out.println(lock.getHoldCount());
    }
    //不可重入
    public void doSomething() throws InterruptedException {
        lock.lock();
        System.out.println(lock.getHoldCount());
        //...................
        lock.unlock();
        System.out.println(lock.getHoldCount());
    }
    public static void main(String[] args) throws InterruptedException {
        Ji_Other_Lock03 test = new Ji_Other_Lock03();
        test.a();
        Thread.sleep(1000);
        System.out.println(test.lock.getHoldCount());
    }

}
// 可重入锁
class ReLock{
    //是否占用
    private boolean isLocked = false;
    private Thread lockedBy = null; //存储线程
    private int holdCount = 0;
    //使用锁
    public synchronized void lock() throws InterruptedException {
        Thread t = Thread.currentThread();
        while(isLocked && lockedBy != t) {
            wait();
        }

        isLocked = true;
        lockedBy = t;
        holdCount ++;
    }
    //释放锁
    public synchronized void unlock() {
        if(Thread.currentThread() == lockedBy) {
            holdCount --;
            if(holdCount ==0) {
                isLocked = false;
                notify();
                lockedBy = null;
            }
        }
    }
    public int getHoldCount() {
        return holdCount;
    }
}
